package cn.lunatic.data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import org.apache.log4j.Logger;

public class DataTable implements Serializable {
	private final static Logger logger = Logger.getLogger(DataTable.class);// 获取

	private static final long serialVersionUID = 1L;

	private List<DataMap> table;

	public DataTable() {
		table = new ArrayList<DataMap>();
	}

	public void clear() {
		table.clear();
	}

	/**
	 * 
	 * @Description:增加一条空记录
	 * @author ganfeng
	 * @date 2014-3-10 上午11:34:55
	 * @return
	 */
	public DataMap addRow() {
		DataMap row = new DataMap();
		table.add(row);
		return row;
	}

	/**
	 * 
	 * @Description:增加一条记录
	 * @author ganfeng
	 * @date 2014-3-10 上午11:35:34
	 * @param row
	 * @return
	 */
	public DataMap addRow(DataMap row) {
		table.add(row);
		return row;
	}

	/**
	 * 设置第一行的一个字段值
	 * 
	 * @param key
	 *            字段名称
	 * @param value
	 *            字段值
	 */
	public void setValue(String key, String value) {
		setValue(key, value, 0);
	}

	/**
	 * 设置最后一行的一个字段值
	 * 
	 * @param key
	 *            字段名称
	 * @param value
	 *            字段值
	 */
	public void setValueLast(String key, String value) {
		setValue(key, value, table.size() - 1);
	}

	/**
	 * 
	 * 功能：设置指定行的一个字段值
	 * 
	 * @param key
	 *            字段名称
	 * @param value
	 *            字段值
	 * @param rowNum
	 *            行号
	 */
	public void setValue(String key, String value, int rowNum) {
		if (value == null) {
			value = "";
		}
		DataMap row = table.get(rowNum);
		row.put(key, value);
	}

	/**
	 * 获取全部数据，用于在jsp页面做展示的数据集
	 * 
	 * @return
	 */
	public DataMap[] getRows() {
		return table.toArray(new DataMap[0]);
	}

	/**
	 * 获取第一行的数据
	 * 
	 * @return
	 */
	public DataMap getRow() {
		return getRow(0);
	}

	/**
	 * 获取最后行的数据
	 * 
	 * @return
	 */
	public DataMap getRowLast() {
		return getRow(table.size() - 1);
	}

	/**
	 * 
	 * 功能：获取数据表
	 * 
	 * @return List<DataMap>
	 */
	public List<DataMap> getTable() {
		return table;
	}

	/**
	 * 
	 * 功能：获取总行数
	 * 
	 * @return int
	 */
	public int getRowCount() {
		return table.size();
	}

	/**
	 * 
	 * 功能：获取某一行数据
	 * 
	 * @param rowNum
	 *            第几行
	 * @return DataMap
	 */
	public DataMap getRow(int rowNum) {
		DataMap row = null;
		try {
			row = table.get(rowNum);
		} catch (Exception e) {
			logger.info("获取第" + rowNum + "行数据出错", e);
		}
		return row;
	}

	/**
	 * 获取某行的某个字段值
	 * 
	 * @param key
	 *            字段
	 * @param rowNum
	 *            行
	 * @return null：无该字段或异常错误；否则为字段值
	 */
	public String getValue(String key, int rowNum) {
		String val = null;
		if (table == null || rowNum < 0 || table.size() < rowNum) {
			return null;
		}
		try {
			val = getRow(rowNum).getString(key);
		} catch (Exception e) {
			return null;
		}
		return val;
	}

	/**
	 * 获取第一行的某个字段值
	 * 
	 * @param key
	 *            字段
	 * @return null：无该字段或异常错误；否则为字段值
	 */
	public String getValue(String key) {
		return getValue(key, 0);
	}

	/**
	 * 获取最后一行的某个字段值
	 * 
	 * @param key
	 *            字段
	 * @return null：无该字段或异常错误；否则为字段值
	 */
	public String getValueLast(String key) {
		return getValue(key, table.size() - 1);
	}

	/**
	 * 获取第一行的某个字段值，忽略空值
	 * 
	 * @param key
	 *            字段
	 * @return 字段值，字段如果为空则返回空串
	 */
	public String getString(String key) {
		return getString(key, 0);
	}

	/**
	 * 获取最后一行的某个字段值，忽略空值
	 * 
	 * @param key
	 *            字段
	 * @return 字段值，字段如果为空则返回空串
	 */
	public String getStringLast(String key) {
		return getString(key, table.size() - 1);
	}

	/**
	 * 获取某一行的某个字段值，忽略空值
	 * 
	 * @param key
	 *            字段
	 * @param rowNum
	 *            行号
	 * @return 字段值，字段如果为空则返回空串
	 */
	public String getString(String key, int rowNum) {
		String tmp = getValue(key, rowNum);
		if (tmp == null) {
			tmp = "";
		}
		return tmp;
	}

	/**
	 * 
	 * 功能：获取某一字段的所有行数据
	 * 
	 * @param colName
	 *            字段名
	 * @return List<String>
	 */
	public List<String> getColumnValues(String colName) {
		List<String> ret = new Vector<String>();
		String s = null;
		for (int i = 0; i < getRowCount(); i++) {
			s = getString(colName, i);
			ret.add(s);
		}
		return ret;
	}
}
